package JAVA并发;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

/**
 * @author zhangmin
 * @create 2022-03-14 21:23
 * 二、基础线程机制
 * Executor：管理多个异步任务的执行，无需显式的管理线程的生命周期--异步指多个线程互不干扰，不需要同步操作
 *     三种：CachedThreadPool：一个任务创建一个线程；
 *          FixedThreadPool：所有任务只能使用固定大小的线程；
 *          SingleThreadExecutor：相当于大小为 1 的 FixedThreadPool。
 * Daemon:守护线程在程序运行时在后台提供服务的线程，不是不可或缺的，所有非守护线程结束时，程序也终止了
 *        同时会杀死所有的守护线程，main（）属于非守护线程
 * sleep():休眠当前正在执行的线程
 * yield：静态方法，声明当前线程已经完成了生命周期中最重要的部分，可以切换给其他线程来执行。--只是给调度器一个建议
 */
public class JCXCJZ2 {

    //sleep
    public void run(){
        try {
            //需要本地处理异常，异常不能跨线程传播回main中
            Thread.sleep(3000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

    //yield
    public void run1(){
        Thread.yield();
    }

    public static void main(String[] args) {
        //1、创建CachedThreadPool
/*        ExecutorService executorService= Executors.newCachedThreadPool();
        for (int i = 0; i < 5; i++) {
            //使用Runnable作为任务，一个任务创建一个线程，一共会创建五个线程
            executorService.execute(new MyRunnable());
        }
        //等待任务全部结束后结束线程
        executorService.shutdown();*/

        //2、创建FixedThreadPool
/*        ExecutorService executorService1=Executors.newFixedThreadPool(2);
        for (int i = 0; i < 5; i++) {
            executorService1.execute(new MyRunnable());
            System.out.println(executorService1.toString());
        }
        executorService1.shutdown();*/


        //3、创建SingleThreadExecutor
/*        ExecutorService executorService2=Executors.newSingleThreadExecutor();
        for (int i = 0; i < 5; i++) {
            executorService2.execute(new MyRunnable());
            System.out.println(executorService2.toString());
        }
        executorService2.shutdown();*/

        //在线程启动之前使用 setDaemon() 方法可以将一个线程设置为守护线程
        Thread thread=new Thread(new MyRunnable());
        thread.setDaemon(true);
    }
}
